package com.briup.day07;

import java.util.StringJoiner;

public class Test {
    // static修饰的方法叫做静态方法/类方法，不需要被对象调用；
    // 没有被static修饰的方法都叫做成员方法，这些方法独属于各个对象所有，
    // 所以写成员方法都需要创建对象来调用，而创建对象的行为只能在程序运行后执行
    public static void main(String[] args) {
        // 如何在Java语言中维护一个人的信息：小明 18岁 男性
        // 在Java中通过new关键字以及对应类的构造器，可以创建出该类的对象
        Person p = new Person();
        // 给这个对象的属性赋值 --> 造物主给事物赋值
        p.name = "小明";
        p.age = 18;
        p.gender = "男性";
        System.out.println(p);
        /*System.out.println(p.hashCode());
        System.out.println(Integer.toHexString(p.hashCode()));*/
        // 表现 小王 20岁 女性
        // 借助于有参构造器，在创建对象时，就给该对象赋予数据
        Person p2 = new Person("小王", 20, "女性");
        System.out.println(p2);
    }
}

// 根据人类共同的特征和行为，定义出人类这个类，即人类在Java语言中的图纸、模板
class Person {
    // 在Java语言中，将特征会抽象为 属性、成员变量
    String name;
    int age;
    String gender;

    /*
        构造器：是类中的一个组成部分，是用于创建对象的方法；
        如果我们在定义类时，没有在类中显示的编写构造器方法，那么JVM在编译时会自动给我们创建
        一个无参的构造器，如果我们在定义类时，自己提供了构造器，那么JVM就不会提供无参构造器；
        如果我们在创建类时创建了多参构造器，那么建议同时创建一个无参构造器

        构造器作为一个特殊的方法，它和方法的定义规范一致：
        方法中的组成部分：
            修饰符：构造器方法的修饰符只能使用权限修饰符
            返回值类型：构造器方法的返回值类型必然是当前构造器所在类的对象，
                      所以在构造器方法中无需指定构造器的类型
            方法名：构造器方法的名字只能与所在类的类名保持一致
            方法的参数列表：和普通方法要求一致，按照需要进行设定即可，
                        通常情况下设置和传入的参数列表都是给类对象进行初始化的
            方法体：构造器方法的方法体中通常编写给类对象初始化的代码
     */
    public Person() {
    }

    public Person(String name, int age, String gender) {
        // this表示当前对象，在构造器中表示当前正在被创建的对象
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // 会将行为，抽象成方法
    // 吃饭的行为
    public void eat() {
        System.out.println("研究表明，人类应该保证一日三餐");
    }

    // 睡觉的行为
    public void sleep() {
        System.out.println("人类通常在夜间休息");
    }

    // 快速生成toString方法 alt+insert键 或 fn+alt+delete键可以快速唤出自动生成代码的面板
    @Override
    public String toString() {
        return new StringJoiner(", ", Person.class.getSimpleName() + "[", "]")
                .add("name='" + name + "'")
                .add("age=" + age)
                .add("gender='" + gender + "'")
                .toString();
    }
}
